<!DOCTYPE html>
<html>

<head>
    <meta charset="utf-8">
    <title>Vue 测试实例 - 菜鸟教程(runoob.com)</title>
    <script src="https://cdn.staticfile.org/vue/2.2.2/vue.min.js"></script>
</head>

<body>
    <div id="app">
        <ol>
            <todo-item v-for="item in sites" v-bind:todo="item"></todo-item>
        </ol>
    </div>

    <script>
        //注意: prop 是单向绑定的：当父组件的属性变化时，将传导给子组件，但是不会反过来。
        Vue.component('todo-item', {
            props: ['todo'],
            template: '<li>{{ todo.text }}</li>'
        })
        new Vue({
            el: '#app',
            data: {
                sites: [
                    { text: 'Runoob' },
                    { text: 'Google' },
                    { text: 'Taobao' }
                ]
            }
        })

        //Prop 验证
        //组件可以为 props 指定验证要求。
        //prop 是一个对象而不是字符串数组时，它包含验证要求：
        Vue.component('example', {
            props: {
                // 基础类型检测 （`null` 意思是任何类型都可以）
                propA: Number,
                // 多种类型
                propB: [String, Number],
                // 必传且是字符串
                propC: {
                    type: String,
                    required: true
                },
                // 数字，有默认值
                propD: {
                    type: Number,
                    default: 100
                },
                // 数组／对象的默认值应当由一个工厂函数返回
                propE: {
                    type: Object,
                    default: function () {
                        return { message: 'hello' }
                    }
                },
                // 自定义验证函数
                propF: {
                    validator: function (value) {
                        return value > 10
                    }
                }
            }
        })
        /*
        type 可以是下面原生构造器：
        String
        Number
        Boolean
        Function
        Object
        Array
        type 也可以是一个自定义构造器，使用 instanceof 检测。
        */
    </script>
</body>

</html>